﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dados;
using System.ComponentModel;

namespace Negocios
{
    [DataObject]
    public class AudioBLL
    {
        [DataObjectMethodAttribute(DataObjectMethodType.Insert, true)]
        public bool Insere(Audio a)
        {

            try
            {
                return AudioDAL.Insere (a.Nome, a.Localizacao, a.Genero.Codigo, a.Autor.Codigo, a.Album.Cod, a.Formato.Codigo, a.Especificacao.Codigo, a.Software.Codigo, a.Usuario.Id);
            }
            catch (Exception ex)
            {
                throw new Exception("Erro ao insereir audio " + a.Nome);
            }
        }
        [DataObjectMethodAttribute(DataObjectMethodType.Update, true)]
        public bool Atualiza(Audio a)
        {
            try
            {
                return AudioDAL.Atualiza(a.Codigo, a.Nome, a.Localizacao, a.Genero.Codigo, a.Autor.Codigo , a.Album.Cod, a.Formato.Codigo, a.Especificacao.Codigo, a.Software.Codigo, a.Usuario.Id);
            }
            catch (Exception ex)
            {
                throw new Exception("Erro ao atualizar audio " + a.Nome);
            }
        }
        [DataObjectMethodAttribute(DataObjectMethodType.Delete, true)]
        public bool Remove(Audio a)
        {
            try
            {
                return AudioDAL.Remove(a.Codigo);
            }
            catch (Exception ex)
            {
                throw new Exception("Erro ao deletar audio " + a.Nome);
            }
        }
        [DataObjectMethodAttribute(DataObjectMethodType.Select, false)]
        public Audio Consulta(int codigo)
        {
            DSMPTUDO.T_AUDIODataTable audioDT = AudioDAL.ConsultaPorCodigo(codigo);
            if (audioDT.Count == 1)
                return (new Audio(audioDT[0].nr_codigo, audioDT[0].tx_nome, audioDT[0].tx_localizacao, new Genero(audioDT[0].nr_genero), new Autor(audioDT[0].nr_autor), new Album(audioDT[0].nr_album), new Formato(audioDT[0].nr_formato), new Especificacao(audioDT[0].nr_especificação), new SoftwareDeReproducao(audioDT[0].nr_software), new Usuario(audioDT[0].tx_usuario)));
            else return null;
        }
        [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
        public static List<Audio> ConsultaTodos()
        {
            List<Audio> lista = new List<Audio>();
            DSMPTUDO.T_AUDIODataTable audioDT = AudioDAL.ConsultaTodos();
            for (int i=0; i<audioDT.Count; i++)
            {
                Audio e = new Audio(audioDT[i].nr_codigo, audioDT[i].tx_nome, audioDT[i].tx_localizacao, new Genero(audioDT[i].nr_genero), new Autor(audioDT[i].nr_autor), new Album(audioDT[i].nr_album), new Formato(audioDT[i].nr_formato), new Especificacao(audioDT[i].nr_especificação), new SoftwareDeReproducao(audioDT[i].nr_software), new Usuario(audioDT[i].tx_usuario));
                lista.Add(e);
            }
            return lista;
         }

        [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
        public static List<Audio> ConsultaPorUsuario(string usuario)
        {
            List<Audio> lista = new List<Audio>();
            DSMPTUDO.T_AUDIODataTable audioDT = AudioDAL.ConsultaPorUsuario(usuario);
            for (int i = 0; i < audioDT.Count; i++)
            {
                Audio e = new Audio(audioDT[i].nr_codigo, audioDT[i].tx_nome, audioDT[i].tx_localizacao, new Genero(audioDT[i].nr_genero), new Autor(audioDT[i].nr_autor), new Album(audioDT[i].nr_album), new Formato(audioDT[i].nr_formato), new Especificacao(audioDT[i].nr_especificação), new SoftwareDeReproducao(audioDT[i].nr_software), new Usuario(audioDT[i].tx_usuario));
                lista.Add(e);
            }
            return lista;
        }

        [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
        public static List<RetornoConsultaPorFiltro> ConsultaPorFiltro
            (string nome, int genero, int autor, int album, int formato)
        {
            List<RetornoConsultaPorFiltro> lista = new List<RetornoConsultaPorFiltro>();
            DSMPTUDO.T_AUDIODataTable audioDT = AudioDAL.ConsultaPorFiltro(nome, genero, autor, album, formato);
            for (int i = 0; i < audioDT.Count; i++)
            {
                Audio audio = new Audio(audioDT[i].nr_codigo, audioDT[i].tx_nome, audioDT[i].tx_localizacao,
                    new Genero(audioDT[i].nr_genero), new Autor(audioDT[i].nr_autor),
                    new Album(audioDT[i].nr_album), new Formato(audioDT[i].nr_formato),
                    new Especificacao(audioDT[i].nr_especificação),
                    new SoftwareDeReproducao(audioDT[i].nr_software),
                    new Usuario(audioDT[i].tx_usuario)
                );

                lista.Add(new RetornoConsultaPorFiltro(audio.Codigo, audio.Nome, audio.Localizacao));
            }
            //return lista.Count != 0 ? lista : null; 
            return lista;
        }
        
        public class RetornoConsultaPorFiltro
        {
            private int codigo;
            private String localizacao;
            private String nome;
            
            //métodos de acesso.
            public int Codigo
            {
                get { return codigo; }
                set { codigo = value; }
            }
            public String Nome
            {
                get { return nome; }
                set { nome = value; }
            }
            public String Localizacao
            {
                get { return localizacao; }
                set { localizacao = value; }
            }

            public RetornoConsultaPorFiltro(int codigo, String nome, String localizacao)
            {
                Codigo = codigo;
                Nome = nome;
                Localizacao = localizacao;
            }
        }
    }

}

    